/**
 * 
 */
package com.mobile2you.nci.android.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * @author JBromo
 * 
 */
public class ImageUtils {

	MemoryCache memoryCache = new MemoryCache();

	static ImageUtils imageUtils;

	FileCache fileCache;

	public static final String NAME = "cache_nci";

	public static void copyStream(InputStream is, OutputStream os) {
		final int buffer_size = 1024;
		try {
			byte[] bytes = new byte[buffer_size];
			for (;;) {
				int count = is.read(bytes, 0, buffer_size);
				if (count == -1) {
					break;
				}
				os.write(bytes, 0, count);
			}
		} catch (Exception ex) {
		}
	}

	public static ImageUtils getInstance(Context context) {
		if (imageUtils == null) {
			imageUtils = new ImageUtils(context);
		}
		return imageUtils;
	}

	private ImageUtils(Context context) {
		fileCache = new FileCache(context);

	}

	public void addImage(String url, Bitmap data) {
		memoryCache.put(url, data);

	}

	public void clearCache() {
		memoryCache.clear();
		fileCache.clear();
		fileCache.deleteFolder();
	}

	// decodes image and scales it to reduce memory consumption
	private Bitmap decodeFileHigh(File f) {
		try {
			return BitmapFactory.decodeStream(new FileInputStream(f));
		} catch (FileNotFoundException e) {
		}
		return null;
	}

	// decodes image and scales it to reduce memory consumption
	private Bitmap decodeFileMin(File f) {
		try {
			// decode image size
			BitmapFactory.Options o = new BitmapFactory.Options();
			o.inJustDecodeBounds = true;
			BitmapFactory.decodeStream(new FileInputStream(f), null, o);

			// Find the correct scale value. It should be the power of 2.
			final int REQUIRED_SIZE = 70;
			int width_tmp = o.outWidth, height_tmp = o.outHeight;
			int scale = 1;
			while (true) {
				if (width_tmp / 2 < REQUIRED_SIZE
						|| height_tmp / 2 < REQUIRED_SIZE) {
					break;
				}
				width_tmp /= 2;
				height_tmp /= 2;
				scale *= 2;
			}

			// decode with inSampleSize
			BitmapFactory.Options o2 = new BitmapFactory.Options();
			o2.inSampleSize = scale;
			return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
		} catch (FileNotFoundException e) {
		}
		return null;
	}

	public Bitmap getBitmapHigh(String url) {
		File f = fileCache.getFile(url);

		System.gc();
		try {
			Bitmap b = decodeFileHigh(f);
			if (b != null) {
				return b;
			}
			return null;
		} catch (Exception exception) {
			return null;
		}

	}

	public Bitmap getBitmapMin(String url) {
		File f = fileCache.getFile(url);

		System.gc();
		try {
			Bitmap b = decodeFileMin(f);
			if (b != null) {
				return b;
			}
			return null;
		} catch (Exception exception) {
			return null;
		}

	}
}
